home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / MacPerl ƒ / Perl Source ƒ / Perl / missing.c < prev    next >
Text File  |  1993-12-20  |  4KB  |  263 lines

  1. /* $Header: missing.c $
  2.  *
  3.  *    Copyright (c) 1991, 1992 Matthias Neeracher
  4.  *
  5.  *    You may distribute under the terms of the Perl Artistic License,
  6.  *    as specified in the README file.
  7.  *
  8.  */
  9.  
  10. #define RESOLVE_MAC_CONFLICTS
  11.  
  12. #include "EXTERN.h"
  13. #include "perl.h"
  14. #include <Folders.h>
  15. #include <Events.h>
  16. #include <GUSI.h>
  17.  
  18. /* Allocate more stdio buffers */
  19.  
  20. FILE _iob[64] = {
  21.     0, nil, nil, nil, 0, _IOREAD,         0,
  22.     0, nil, nil, nil, 0, _IOWRT,          1,
  23.     0, nil, nil, nil, 0, _IOWRT+_IOLBF,    2
  24. };
  25.     
  26. FILE * _lastbuf = _iob + 64;
  27.  
  28. /* Calls that don't exist on the mac */
  29.  
  30. /* Borrowed from msdos.c
  31.  * Just pretend that everyone is a superuser
  32.  */
  33. #define ROOT_UID    0
  34. #define ROOT_GID    0
  35. int
  36. getuid(void)
  37. {
  38.     return ROOT_UID;
  39. }
  40.  
  41. int
  42. geteuid(void)
  43. {
  44.     return ROOT_UID;
  45. }
  46.  
  47. int
  48. getgid(void)
  49. {
  50.     return ROOT_GID;
  51. }
  52.  
  53. int
  54. getegid(void)
  55. {
  56.     return ROOT_GID;
  57. }
  58.  
  59. int
  60. setuid(int uid)
  61.     return (uid==ROOT_UID?0:-1);
  62. }
  63.  
  64. int
  65. setgid(int gid)
  66.     return (gid==ROOT_GID?0:-1); 
  67. }
  68.  
  69. execv()
  70. {
  71.     fatal("execv() not implemented on the Macintosh");
  72. }
  73.  
  74. execvp()
  75. {
  76.     fatal("execvp() not implemented on the Macintosh");
  77. }
  78.  
  79. utime()
  80. {
  81.     fatal("utime() not implemented on the Macintosh");
  82. }
  83.  
  84. chmod()
  85. {
  86. }
  87.  
  88. kill()
  89. {
  90.     fatal("kill() not implemented on the Macintosh");
  91. }
  92.  
  93. sleep(int seconds)
  94. {
  95.     long    ticks    =    TickCount() + seconds*60;
  96.     
  97.     while (TickCount() < ticks)
  98.         SpinMacCursor();
  99. }
  100.  
  101. do_aspawn()
  102. {
  103.     fatal("do_aspawn() not implemented on the Macintosh");
  104. }
  105.  
  106. do_spawn()
  107. {
  108.     fatal("do_spawn() not implemented on the Macintosh");
  109. }
  110.  
  111. char **environ;
  112. extern int StandAlone;
  113.  
  114. char ** init_env(char ** env)
  115. {
  116.     int        envcnt    =    0;
  117.     int        envsize    =    0;
  118.     int        varlen;
  119.     char *    envpool;
  120.     FILE *    envfile    =    0;
  121.     
  122.     for (envcnt = 0; env[envcnt]; envcnt++)    {
  123.         varlen    = strlen(env[envcnt]);
  124.         envsize    +=    varlen+strlen(env[envcnt]+varlen+1)+2;
  125.     }
  126.     
  127.     environ = (char **)     malloc((envcnt+1)*sizeof(char *));
  128.     envpool = (char *)     malloc(envsize);
  129.     
  130.     for (envcnt = 0; env[envcnt]; envcnt++)    {
  131.         environ[envcnt]     = envpool;
  132.         varlen                = strlen(env[envcnt]);
  133.         strcpy(envpool, env[envcnt]);
  134.         envpool              += varlen+1;
  135.         envpool[-1]            = '=';
  136.         strcpy(envpool, env[envcnt]+varlen+1);
  137.         envpool              += strlen(env[envcnt]+varlen+1)+1;
  138.     }
  139.  
  140.     environ[envcnt] = 0;
  141.     
  142.     return environ;
  143. }    
  144.  
  145. typedef struct PD {
  146.     struct PD *    next;
  147.     FILE *        tempFile;
  148.     FSSpec        pipeFile;
  149.     char *        execute;
  150. } PipeDescr, *PipeDescrPtr;
  151.  
  152. static PipeDescrPtr    pipes        =    nil;
  153. static Boolean            sweeper    =    false;
  154.  
  155. void sweep()
  156. {
  157.     while (pipes)
  158.         mypclose(pipes->tempFile);
  159. }
  160.  
  161. FILE * mypopen(char * command, char * mode)
  162. {
  163.     PipeDescrPtr    pipe;
  164.     
  165.     New(666, pipe, 1, PipeDescr);
  166.     
  167.     if (!pipe)
  168.         return NULL;
  169.         
  170.     if (FSpMakeTempFile(&pipe->pipeFile))
  171.         goto failed;
  172.     pipe->execute    =    nil;
  173.     
  174.     switch(*mode)    {
  175.     case 'r':
  176.         /* Ugh ! A hardcoded command  ! */
  177.         
  178.         if (!strcmp(command, "pwd") || !strcmp(command, "Directory")) {
  179.             char curdir[256];
  180.             
  181.             if (!(pipe->tempFile    = fopen(FSp2FullPath(&pipe->pipeFile), "w")))
  182.                 goto delete;
  183.             if (!getcwd(curdir, 256)) 
  184.                 goto delete;
  185.             
  186.             fprintf(pipe->tempFile, "%s\n", curdir);
  187.             fclose(pipe->tempFile);
  188.         } else if (SubLaunch(command, nil, &pipe->pipeFile, nil))
  189.             goto delete;
  190.             
  191.         if (!(pipe->tempFile    = fopen(FSp2FullPath(&pipe->pipeFile), "r")))
  192.             goto delete;
  193.         break;
  194.     case 'w':
  195.         New(667, pipe->execute, strlen(command)+1, char);
  196.         if (!pipe->execute || !(pipe->tempFile    = fopen(FSp2FullPath(&pipe->pipeFile), "w")))
  197.             goto delete;
  198.         strcpy(pipe->execute, command);
  199.         break;
  200.     }
  201.     
  202.     pipe->next    =    pipes;
  203.     pipes            =    pipe;
  204.     
  205.     if (!sweeper)    {
  206.         atexit(sweep);
  207.         sweeper    =    true;
  208.     }
  209.  
  210.     return pipe->tempFile;
  211. delete:
  212.     if (pipe->execute)
  213.         Safefree(pipe->execute);
  214.     HDelete(pipe->pipeFile.vRefNum, pipe->pipeFile.parID, pipe->pipeFile.name);
  215. failed:
  216.     Safefree(pipe);
  217.     
  218.     return NULL;
  219. }
  220.  
  221. int mypclose(FILE *    f)
  222. {
  223.     OSErr                err;
  224.     PipeDescrPtr *    prev;
  225.     PipeDescrPtr    pipe;
  226.     
  227.     for (prev = (PipeDescrPtr *) &pipes; pipe = *prev; prev = &pipe->next)
  228.         if (pipe->tempFile == f)
  229.             break;
  230.     
  231.     if (!pipe)
  232.         return -1;
  233.     
  234.     *prev = pipe->next;
  235.     
  236.     fclose(f);
  237.     
  238.     if (pipe->execute)
  239.         err = SubLaunch(pipe->execute, &pipe->pipeFile, nil, nil);
  240.     else
  241.         err = noErr;
  242.         
  243.     HDelete(pipe->pipeFile.vRefNum, pipe->pipeFile.parID, pipe->pipeFile.name);
  244.     if (pipe->execute)
  245.         Safefree(pipe->execute);
  246.     Safefree(pipe);
  247.     
  248.     return err?-1:0;    
  249. }
  250.  
  251. void SpinMacCursor()
  252. {
  253.     (GUSIGetSpin())(SP_AUTO_SPIN, 1);
  254. }
  255.  
  256. void init_missing()
  257. {
  258.     environ         =    nil;
  259.     pipes            =    nil;
  260. }
  261.